package com.java.simple.study.jvm.classloader;

import java.util.Random;

/**
 * @author zhoujunlin
 * @date 2023年01月31日 11:49
 * @desc 类的被动使用
 */
public class PassiveUse {

    public static void main(String[] args) {
        //testParentStaticFiled();
        //testArray();
        //testInterface();
        testClassLoader();
    }

    public static void testClassLoader() {
        try {
            // ClassLoader加载类并不是主动使用  不会导致类init
            ClassLoader.getSystemClassLoader().loadClass("com.java.simple.study.jvm.classloader.Parent");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void testInterface() {
        // 接口的常量不会导致初始化   linking阶段就已经显示赋值了
        System.out.println(Serival.num);
        System.out.println("-----------");
        System.out.println(Serival.num2);
    }

    public static void testArray() {
        // 数组的定义不会导致初始化
        Parent[] parents = new Parent[10];
        System.out.println(parents.getClass());
        // new 数组元素才会初始化
        parents[0] = new Parent();
    }

    public static void testParentStaticFiled() {
        // 子类调用父类静态变量  不会导致子类初始化  父类会初始化
        System.out.println(Child.num);
    }

}

class Parent {
    static {
        System.out.println("Parent类的初始化");
    }

    public static int num = 1;
}

class Child extends Parent {
    static {
        System.out.println("Child类的初始化");
    }
}


interface Serival {
    /**
     * 验证接口的初始化
     */
    public static final Thread t = new Thread() {
        {
            System.out.println("Serival初始化");
        }
    };

    public static int num = 10;
    public static final int num2 = new Random().nextInt(10);

}
